package com.afdor.rws.event.driven.api.channel.consumer;

import com.afdor.rws.event.driven.api.EventBus;
import com.afdor.rws.event.driven.api.EventHolder;
import com.afdor.rws.event.driven.api.Serialization;
import com.afdor.rws.event.driven.api.channel.consumer.handler.EventHandler;
import com.afdor.rws.event.driven.api.channel.consumer.handler.EventRetryStrategy;
import com.afdor.rws.event.driven.config.EventConsumerConfig;

/**
 * 事件消费者
 *
 * @author 悭梵
 * @date Created in 2018-08-07 15:07
 */
public interface EventConsumer<EH extends EventHolder, CC extends EventConsumerConfig> {
    /**
     * 启动事件消费者，执行消费事件
     */
    void start();

    /**
     * 获取配置信息
     *
     * @return
     */
    <CC extends EventConsumerConfig> CC getConfig();

    /**
     * 这是配置信息
     *
     * @param config
     * @param <T>
     * @return
     */
    <T extends EventConsumer> T setConfig(CC config);


    /**
     * 所属事件总线
     *
     * @return
     */
    EventBus getEventBus();

    /**
     * 所属事件总线
     *
     * @param eventBus
     * @param <T>
     * @return
     */
    <T extends EventConsumer> T setEventBus(EventBus eventBus);

    /**
     * 获取事件源名称
     *
     * @return
     */
    String getEventSourceName();

    /**
     * 获取消费者名称，名称相同则任务是同一个消费者
     *
     * @return
     */
    String getConsumerName();

    /**
     * 返回序列化器-用于事件传输
     *
     * @return
     */
    Serialization getSerialization();

    /**
     * 获取事件处理的具体实现
     *
     * @return
     */
    EventHandler<EH> getEventHandler();

    /**
     * 设置事件处理的具体实现对象
     *
     * @return
     */
    <T extends EventConsumer> T setEventHandler(EventHandler<EH> eventHandler);


    /**
     * 获取事件消费失败重试策略
     *
     * @return
     */
    EventRetryStrategy getEventRetryStrategy();

    /**
     * 设置事件消费失败重试策略
     *
     * @return
     */
    <T extends EventConsumer> T setEventRetryStrategy(EventRetryStrategy eventRetryStrategy);

    /**
     * 添加标签过滤器
     *
     * @param tagLabel
     * @param value
     * @return
     */
    <T extends EventConsumer> T addFilterTag(String tagLabel, String value);

    /**
     * 停止事件消费
     */
    void stop();

}
